/*  -------------------------- (C) COPYRIGHT 2022 Fortiortech ShenZhen ---------------------------*/
/**
    @copyright (C) COPYRIGHT 2022 Fortiortech Shenzhen
    @file      main.c
    @author    Fortiortech  Appliction Team
    @since     Create:2022-07-14
    @date      Last modify:2022-07-14
    @note      Last modify author is Leo.li
    @brief     包含主函数，软硬件初始化函数，VRER配置函数
*/

/********************************************************************************
    Header Definition
********************************************************************************/
#include <FU68xx_2.h>
#include <Myproject.h>

uint8 data g_1mTick = 0; ///< 1ms滴答信号，每隔1ms在SYSTICK定时器被置1，需在大循环使用处清零

/**
    @brief        Function Definition
*/
static void SoftwareInit(void);
static void HardwareInit(void);
void MotorControlInit(void);

/**
    @brief        部分变量初始化，上电运行一次
    @date         2022-07-14
*/
void SoftwareInit(void)
{
    /*----- 初始化所有定义的参数变量 -----*/
    MotorcontrolInit();
#if (SPEED_MODE == KEYSCANMODE)
    /*----- 按键参数初始化 -----*/
    KeyInit();
    ledInit();
#endif
    /* ----- 电机初始状态为mcReady，故障保护为无故障 -----*/
    mcState = mcReady;
    mcFaultSource = 0;
}

/**
    @brief        参考电压，偏置电压配置
    @date         2022-07-14
*/
void VREFConfigInit(void)
{
/************************VREF&VHALF Config************************/
#if (HW_ADC_VREF == VREF3_0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
#elif (HW_ADC_VREF == VREF4_0)
    {
        SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
#elif (HW_ADC_VREF == VREF4_5)
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
#elif (HW_ADC_VREF == VREF5_0)
    {
        ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V   01-->VDD5
        SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V   11-->4.0V
    }
#endif
#if (VREF_OUT_EN)
    SetBit(P3_AN, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚，需同步配置输出
    SetBit(P3_OE, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚
#endif
#if (VHALF_OUT_EN)
    SetBit(P3_AN, P32);
#endif
    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN); // VREF_VHALF_CR = 0x11;
    /* ---------------------------------------------------------------------- */
}

/**
    @brief     硬件初始化，初始化需要使用的硬件设备配置，FOC必须配置的是运放电压、运放初始化、ADC初始化、Driver初始化
              其他的可根据实际需求加。
    @date      2022-07-14
*/
void HardwareInit(void)
{
    VREFConfigInit();
    /******比较器初始化，用于硬件过流比较保护******/
    CMP3_Init(); // 选择比较过流，比较器初始化
    /****功能IO初始化***********/
    GPIO_Init();
    /*****运算放大器初始化*********/
    AMP_Init();
    /*****ADC初始化*********/
    ADC_Init();
    /****比较器中断配置***********/
    CMP3_Inter_Init(); // 建议和比较器初始化间隔一段时间
    /*****Driver初始化*********/
    Driver_Init();
    /* -----过零点检测初始化----- */
    ZeroCrossing_Init();

#if (SPEED_MODE == KEYSCANMODE)
    TIM3_Init(); // 端口GP11,采样定时器3中断作为PWM捕获中断
    TIM2_Init(); // 端口GP11,采样定时器3中断作为PWM捕获中断
#endif
    /*****UART初始化*********/
    // UART_Init();//未配置
    /*****Timer初始化*******/
    TIM1ms_Init(); // 采用1ms定时器中断作为常见中断,处理故障保护等附加功能
    /*开启SMDU运算模块*/
    SetBit(TIM234_CTRL, MDU_EN_N);
}

/**
    @brief        主函数，大循环运行偏置电流采集函数，电机状态机控制函数，以及环路响应函数
    @date         2022-07-14
*/
void main(void)
{
    uint16 PowerUpCnt = 0;

    for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++)
    {
    };

    /*Software Init*/
    SoftwareInit();

    /*Hardware Init*/
    HardwareInit();

#if (SPEED_MODE == KEYSCANMODE)
    MCCtrl.FlagONOFF = 1;
#endif
    WatchDogConfig(200, Enable);

/* ----- 电机目标方向 ----- */
#if (FREnable)
    {
        MCCtrl.FR_Status = FRPin;
    }

#else
    {
        MCCtrl.FR_Status = FR_MODE; // 配置电机运行方向
    }
#endif

    while (1)
    {
        /* -----获取电流采样偏置电压----- */
        if (!mcCurOffset.OffsetFlag)
        {
            GetCurrentOffset();
        }
        else
        {
            /* -----电机控制状态机----- */
            MC_Control();

            /* -----1ms时序处理----- */
            if (g_1mTick)
            {
                // GP12=1;
                if (User.ScrOnAngleTime != 0)
                {
                    DCBusAvg(); // 母线电压平均值
                }
                // tempOff();
                overHeat(); // 过热保护
                // NTCTempAdjust();
                // NTCFaultTest();
                // powerLoss();
                zeroLoss();
                faultLed();
                TickCycle_1ms();
#if ((SPEED_MODE == KEYSCANMODE) && (START_MODE == PLL_Start))
                if (PLLfunction.PLLFunctionFlag > 2)
                {
                    if (MCCtrl.InitDelayFlag == 0)
                    {
                        MCCtrl.InitDelayFlag = 1;
                        TIM3_Init(); // 端口GP11,采样定时器3中断作为PWM捕获中断
                        TIM2_Init(); // 端口GP11,采样定时器3中断作为PWM捕获中断
                    }
                }
                else
                {
                    ClrBit(TIM3_CR1, T3EN);
                }
#endif
                g_1mTick = 0;
                // GP12=0;
            }
        }
    }
}